package tp.pr5.mv.instructions.jump;


import tp.pr5.mv.Instruction;
import tp.pr5.mv.Memory;
import tp.pr5.mv.Opcode;
import tp.pr5.mv.OperandStack;
import tp.pr5.mv.ProgramCounter;
import tp.pr5.mv.inout.InMethod;
import tp.pr5.mv.inout.OutMethod;
import tp.pr5.mv.traps.MVTrap;
import tp.pr5.mv.traps.WithoutOperandsEx;


public class JUMPIND extends Instruction {

	/* Instrucción de salto a la direción que indique la cima de la pila. */
	
	public JUMPIND() {
		op = Opcode.JUMPIND;
	}

	public void execute(OperandStack stack, Memory mem, ProgramCounter pc, InMethod inMethod, OutMethod outMethod) throws MVTrap {
		
		if ( stack.isEmpty() )    // Necesitamos al menos un operando en la pila.
			throw new WithoutOperandsEx( this, stack.getCounter() );
		
			
		int a = stack.top();       // Nos quedamos con el valor de la cima de la pila en una variable y lo eliminamos de la pila de operandos.
		stack.pop();
		
		pc.setPC( a - 1 );         // Saltamos a la posición de mem. que nos indica a.  
		
	}


	
}
